package com.mudu.search.result;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mudu.search.enums.ResultEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

@Data
@EqualsAndHashCode(callSuper = true)
public class PageResult<T> extends Result<List<T>> {

    @ApiModelProperty(value = "总记录数")
    private long totalCount;

    @ApiModelProperty(value = "当前页")
    private long current;

    @ApiModelProperty(value = "每页行数")
    private long size;

    private PageResult(Integer code, String message, Page<T> pageQuery) {
        super(code, message, pageQuery.getRecords());
        this.totalCount = pageQuery.getTotal();
        this.current = pageQuery.getCurrent();
        this.size = pageQuery.getSize();
    }

    private PageResult(List<T> list, Integer count, Integer current, Integer size) {
        super(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), list);
        this.totalCount = count;
        this.size = size;
        this.current = current;
    }


    private PageResult(Integer code, String message) {
        super(code, message);
    }

    /**
     * 正常返回json结果
     *
     * @param data 数据
     * @param <X>  数据类型
     * @return json结果
     */
    public static <X> PageResult<X> ok(Page<X> data) {
        return ok(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 正常返回json结果，自定义返回码和返回信息
     *
     * @param data    数据
     * @param code    自定义返回码
     * @param message 自定义返回信息
     * @param <X>     数据类型
     * @return json结果
     */
    public static <X> PageResult<X> ok(Integer code, String message, Page<X> data) {
        return new PageResult<X>(code, message, data);
    }

    public static <X> PageResult<X> ok(List<X> list, Integer count, Integer current, Integer size) {
        return new PageResult<X>(list, count, current, size);
    }

    public static <X> PageResult<X> ok(List<X> list, Integer count) {
        return new PageResult<X>(list, count, 0, list.size());
    }

    public static <X> PageResult<X> ok(List<X> list) {
        return new PageResult<X>(list, list.size(), 0, list.size());
    }


    /**
     * 错误返回结果
     *
     * @param data 错误数据
     * @param <X>  错误数据类型
     * @return 错误返回结果
     */
    public static <X> PageResult<X> error(Page<X> data) {
        return error(data, ResultEnum.ERROR);
    }

    /**
     * 错误返回结果
     *
     * @param data       错误数据
     * @param resultEnum 错误信息枚举
     * @param <X>        错误数据类型
     * @return 错误返回结果
     */
    public static <X> PageResult<X> error(Page<X> data, ResultEnum resultEnum) {
        return error(resultEnum.getCode(), resultEnum.getMessage(), data);
    }

    /**
     * 错误返回结果，自定义返回码和返回信息
     *
     * @param data    错误数据
     * @param code    自定义返回码
     * @param message 自定义返回信息
     * @param <X>     错误数据类型
     * @return 错误返回结果
     */
    public static <X> PageResult<X> error(Integer code, String message, Page<X> data) {
        return new PageResult<X>(code, message, data);
    }

    public static <X> PageResult<X> err() {
        return new PageResult<X>(ResultEnum.ERROR.getCode(), ResultEnum.ERROR.getMessage());
    }

    public static <X> PageResult<X> err(String err) {
        if (StrUtil.isBlank(err)) {
            return err();
        }
        return new PageResult<X>(400, err);
    }

}
